{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] } ], "source": [ "%pylab inline" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from tempfile import NamedTemporaryFile\n", "#import base64\n", "\n", "VIDEO_TAG = \"\"\"\"\"\"\n", "\n", "def anim_to_html(anim):\n", " if not hasattr(anim, '_encoded_video'):\n", " with NamedTemporaryFile(suffix='.mp4') as f:\n", " anim.save(f.name, writer='mencoder', fps=20) #extra_args=['-vcodec', 'libx264'])\n", " video = open(f.name, \"rb\").read()\n", " anim._encoded_video = video.encode(\"base64\")\n", " \n", " return VIDEO_TAG.format(anim._encoded_video)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from IPython.display import HTML\n", "\n", "def display_animation(anim):\n", " plt.close(anim._fig)\n", " return HTML(anim_to_html(anim))" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from matplotlib import animation\n", "\n", "# First set up the figure, the axis, and the plot element we want to animate\n", "fig = plt.figure()\n", "ax = plt.axes(xlim=(0, 2), ylim=(-2, 2))\n", "line, = ax.plot([], [], lw=2)\n", "\n", "# initialization function: plot the background of each frame\n", "def init():\n", " line.set_data([], [])\n", " return line,\n", "\n", "# animation function. This is called sequentially\n", "def animate(i):\n", " x = np.linspace(0, 2, 1000)\n", " y = np.sin(2 * np.pi * (x - 0.01 * i))\n", " line.set_data(x, y)\n", " return line,\n", "\n", "# call the animator. blit=True means only re-draw the parts that have changed.\n", "anim = animation.FuncAnimation(fig, animate, init_func=init,\n", " frames=100, interval=20, blit=True)\n", "\n", "# call our new function to display the animation\n", "display_animation(anim)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "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\n", "GQAAAABJRU5ErkJggg==\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#! /usr/bin/env python2.7\n", "# Double pendulum formula translated from the C code at\n", "# http://www.physics.usyd.edu.au/~wheat/dpend_html/solve_dpend.c\n", "\n", "from numpy import sin, cos, pi, array\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import scipy.integrate as integrate\n", "import matplotlib.animation as animation\n", "\n", "G = 9.8 # acceleration due to gravity, in m/s^2\n", "L1 = 1.0 # length of pendulum 1 in m\n", "L2 = 1.0 # length of pendulum 2 in m\n", "M1 = 1.0 # mass of pendulum 1 in kg\n", "M2 = 1.0 # mass of pendulum 2 in kg\n", "\n", "\n", "def derivs(state, t):\n", "\n", " dydx = np.zeros_like(state)\n", " dydx[0] = state[1]\n", "\n", " del_ = state[2]-state[0]\n", " den1 = (M1+M2)*L1 - M2*L1*cos(del_)*cos(del_)\n", " dydx[1] = (M2*L1*state[1]*state[1]*sin(del_)*cos(del_)\n", " + M2*G*sin(state[2])*cos(del_) + M2*L2*state[3]*state[3]*sin(del_)\n", " - (M1+M2)*G*sin(state[0]))/den1\n", "\n", " dydx[2] = state[3]\n", "\n", " den2 = (L2/L1)*den1\n", " dydx[3] = (-M2*L2*state[3]*state[3]*sin(del_)*cos(del_)\n", " + (M1+M2)*G*sin(state[0])*cos(del_)\n", " - (M1+M2)*L1*state[1]*state[1]*sin(del_)\n", " - (M1+M2)*G*sin(state[2]))/den2\n", "\n", " return dydx\n", "\n", "# create a time array from 0..100 sampled at 0.1 second steps\n", "dt = 0.05\n", "t = np.arange(0.0, 20, dt)\n", "\n", "# th1 and th2 are the initial angles (degrees)\n", "# w10 and w20 are the initial angular velocities (degrees per second)\n", "th1 = 120.0\n", "w1 = 0.0\n", "th2 = -10.0\n", "w2 = 0.0\n", "\n", "rad = pi/180\n", "\n", "# initial state\n", "state = np.array([th1, w1, th2, w2])*pi/180.\n", "\n", "# integrate your ODE using scipy.integrate.\n", "y = integrate.odeint(derivs, state, t)\n", "\n", "x1 = L1*sin(y[:,0])\n", "y1 = -L1*cos(y[:,0])\n", "\n", "x2 = L2*sin(y[:,2]) + x1\n", "y2 = -L2*cos(y[:,2]) + y1\n", "\n", "fig = plt.figure()\n", "ax = fig.add_subplot(111, autoscale_on=False, xlim=(-2, 2), ylim=(-2, 2))\n", "ax.grid()\n", "\n", "line, = ax.plot([], [], 'o-', lw=2)\n", "time_template = 'time = %.1fs'\n", "time_text = ax.text(0.05, 0.9, '', transform=ax.transAxes)\n", "\n", "def init():\n", " line.set_data([], [])\n", " time_text.set_text('')\n", " return line, time_text\n", "\n", "def animate(i):\n", " thisx = [0, x1[i], x2[i]]\n", " thisy = [0, y1[i], y2[i]]\n", "\n", " line.set_data(thisx, thisy)\n", " time_text.set_text(time_template%(i*dt))\n", " return line, time_text\n", "\n", "ani = animation.FuncAnimation(fig, animate, np.arange(1, len(y)),\n", " interval=25, blit=True, init_func=init)\n", "\n", "ani.save('double_pendulum.mp4', writer='mencoder', fps=15)\n", "# ani.save('double_pendulum.mp4', fps=15, clear_temp=True)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.6" } }, "nbformat": 4, "nbformat_minor": 0 }